#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include <unistd.h>
#include <sys/poll.h>
#include <string.h>

// ./demo6 <file>
int main(int argc, char const *argv[])
{
    if(argc !=2 ) return -1;
    struct pollfd fds[2];  // 1. 创建poll机制的数组
    // 2. 初始化poll机制的数组
    fds[0].fd = STDIN_FILENO;
    fds[0].events = POLLIN;

    fds[1].fd = open(argv[1], O_WRONLY|O_CREAT|O_TRUNC, 0644);
    fds[1].events = POLLOUT | POLLERR;

    // 3. 业务功能的依赖
    ssize_t datalen = 0;
    char buf[64]="";

    // 4. 循环验证哪些FD的事件发生了
    int n; // 发生事件的FD的个数
    while(1){
        n = poll(fds, 2, -1);
        if(n < 0) break;

        if(fds[0].revents & POLLIN){
            // 发生输入事件
           datalen=read(fds[0].fd, buf, 64);
        }

        if(fds[1].revents & POLLOUT && datalen){
            if(strncmp("q", buf, 1) == 0) break;
            write(fds[1].fd, buf, datalen);
            datalen = 0;
        }

        if(fds[1].revents & POLLERR  || fds[1].revents & POLLHUP){
            break;
        }

    }
    close(fds[1].fd);
    printf("---over---\n");
    return 0;
}
